/**
 * @Author: FxShadow
 * @Description:
 * @Date: 2022/12/20 15:56
 */

package utils

import (
	"fmt"
	"github.com/gomodule/redigo/redis"
	"github.com/spf13/viper"
)

// 定义全局pool
var pool *redis.Pool

// 当启动程序时，就初始化连接池
func InitRedis() {
	pool = &redis.Pool{
		MaxIdle:     8,   //最大空闲连接数
		MaxActive:   0,   //表示和数据库的最大连接数， 0 表示没限制
		IdleTimeout: 100, //最大空闲时间
		Dial: func() (redis.Conn, error) { //初始化连接的代码，连接哪个ip
			return redis.Dial("tcp", viper.GetString("redis.addr"))
		},
	}
}

// 从Redis池内获取连接
func GetRedis() redis.Conn {
	conn := pool.Get()
	return conn
}

// 发布消息
func Publish(conn redis.Conn, commandName string, msg string) (err string) {
	fmt.Println("redis publish...")
	err = conn.Send(commandName, msg).Error()
	return
}

// 订阅消息
func Subscribe(conn redis.Conn, msg string) (string error) {
	psc := redis.PubSubConn{Conn: conn}
	fmt.Println("redis subscribe...")
	for {
		switch v := psc.Receive().(type) {
		case redis.Message:
			fmt.Printf("%s: message: %s\n", v.Channel, v.Data)
		case redis.Subscription:
			fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)
		case error:
			return v
		}
	}
	return
}
